Dockerfile 是一個用來定義 Docker Image 的文本文件,它包含了一系列指令,指示 Docker 如何從零構建一個完整的映像。每個指令都會在構建過程中執行,最終生成一個可以部署的 Docker Image。
當你執行 docker build 命令時,Docker 會依據 Dockerfile 的每一行指令,逐步構建 Image。這些指令通常是分層構建的,這意味著每一條指令會生成一個新的層,最終所有層一起組成完整的 Image。層化的好處是提高了構建的效率,因為 Docker 可以快取每一層的結果,如果有些層已經沒有變化,則不需要重新執行。
在 Dockerfile 中,沒有強制要求的必要欄位。但有一些欄位是幾乎所有 Dockerfile 都會使用的,這些欄位幫助你正確地構建和運行映像。
以下是常見且建議使用的欄位和指令,但並非「必要」的:
FROM
FROM
的話,Dockerfile 無法運行。FROM ubuntu:20.04
LABEL
LABEL maintainer="you@example.com"
RUN
RUN apt-get update && apt-get install -y nginx
COPY
或 ADD
COPY
用於簡單的文件複製,ADD
具有更多的功能,比如自動解壓 tar 文件。COPY ./my-app /app
CMD
或 ENTRYPOINT
CMD
:指定容器啟動時的默認命令或參數。可以被 docker run
的命令行覆蓋。ENTRYPOINT
:指定容器啟動時的主命令,通常與 CMD
配合使用,用來設置默認參數。CMD
或 ENTRYPOINT
,來確保容器啟動時有默認的操作。如果沒有設置這些指令,容器啟動後會退出。CMD ["nginx", "-g", "daemon off;"]
EXPOSE
docker run
時明確指定。EXPOSE 80
WORKDIR
WORKDIR
可以減少手動切換目錄的需要。WORKDIR /app
ENV
ENV MYSQL_ROOT_PASSWORD=my-secret-pw
以下是一個常見的 Dockerfile 範例,它使用了部分上面提到的指令:
# 基礎映像
FROM ubuntu:20.04
# 添加作者信息
LABEL maintainer="you@example.com"
# 安裝必要軟件
RUN apt-get update && apt-get install -y nginx
# 複製應用程序文件
COPY ./my-app /var/www/html
# 設定工作目錄
WORKDIR /var/www/html
# 設定環境變數
ENV APP_ENV=production
# 暴露端口
EXPOSE 80
# 設定容器啟動時的命令
CMD ["nginx", "-g", "daemon off;"]
FROM
幾乎是必須的,因為它定義了映像的基礎環境。RUN
、COPY
、CMD
也是大多數 Dockerfile 都會使用的,因為它們用來配置和定義容器的行為。今天Dockfile學習到這邊,明天來執行Docker Build!